package univ.lille1.fr.car.manager;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import univ.lille1.fr.car.ejb.Auteur;
import univ.lille1.fr.car.ejb.Livre;

@Stateless
public class LivreManager {
	
	private static final String PERSISTENCE_UNIT_NAME = "LibraryDB";
	private EntityManagerFactory entityManagerFactory;
	
	@PersistenceContext
	private EntityManager entityManager;
	private CriteriaBuilder criteriaBuilder;
	
	public LivreManager() {
		entityManagerFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
		entityManager = entityManagerFactory.createEntityManager();
	}
	
	// Ajout de quelques livres dans la bdd
	public void init(){
		
		// livres
		Livre livre1 = new Livre("THRONE OF GLASS 1", "2012");
		Livre livre2 = new Livre("20000 LIEUES SOUS LES MERS", "1870");
		Livre livre3 = new Livre("VENDREDI OU LA VIE SAUVAGE", "1971");
		
		// ajout des auteurs
		Auteur auteur1 = new Auteur(1,"MAAS","SARAH J.");
		Auteur auteur2 = new Auteur(2,"VERNES","JULES");
		Auteur auteur3 = new Auteur(3,"TOURNIER","MICHEL");
		
		livre1.getAuteur().add(auteur1);
		livre2.getAuteur().add(auteur2);
		livre3.getAuteur().add(auteur3);
		
		entityManager.getTransaction().begin();
		entityManager.persist(livre1);
		entityManager.persist(livre2);
		entityManager.persist(livre3);
		entityManager.getTransaction().commit();
		
//		this.close();
	}

	public void add(String titre, String annee) {
		Livre livre = new Livre(titre, annee);
		entityManager.getTransaction().begin();
		entityManager.persist(livre);
		entityManager.getTransaction().commit();
//		this.close();
	}
	
	public void addObject(Livre livre) {
		entityManager.getTransaction().begin();
		entityManager.persist(livre);
		entityManager.getTransaction().commit();
//		this.close();
	}

	public void remove(String titre) {
		Livre livre = entityManager.find(Livre.class, titre);
		entityManager.getTransaction().begin();
		if(livre != null){
			entityManager.remove(livre);
		}
//		entityManager.close();
		entityManager.getTransaction().commit();
//		this.close();
	}
	
	public List<Livre> findAll() {
		criteriaBuilder = entityManagerFactory.getCriteriaBuilder();
		CriteriaQuery<Livre> criteriaQuery = criteriaBuilder.createQuery(Livre.class);
		Root<Livre> livres = criteriaQuery.from(Livre.class);
		criteriaQuery.select(livres);
		TypedQuery<Livre> typedQuery = entityManager.createQuery(criteriaQuery);
		return typedQuery.getResultList();
	}
	
	public void close(){
		entityManager.close();
		entityManagerFactory.close();
	}
	
	public EntityManager getEntityManager(){
		return this.entityManager;
	}
}
